plinstrument:
{
calc:"
// based on SHE-FAP1818F

#include	colorconv
#include	ledref
#include	hsv
#include	strobe


// controls
cMod; cR; cG; cB; cW; cA; cU; cDim; cStb; cPrg; cPgs;

// parameters
pMod;

// constants
kDia = 0.24;
kWid = 0.28;
kHi  = 0.28;
kZBack = 0.05;
kZFront = -0.16;

kCnt = 2;
kSpread = Spread(kCnt, 0.1, 45);	// (field angle?)
kSource = LEDRefConv(18*18, kDia, kLEDRefWatt_RGBWAU, kLEDRefDia_RGBWAU, kLEDRefSrc_RGBWAU);
kWhite = kLEDRefWhite_RGBWAU;
kAmber = kLEDRefAmber_RGBWAU;
kUV    = kLEDRefUV_RGBWAU;


// protocol parameters
LIGHT;
SHAPE;
CTLS;

PRM=1;
CTL;


// methods

// color

gColor;

ColorTime#
(
	gColor = Vec(cR / 255, cG / 255, cB / 255, cW / 255, cA / 255, cU / 255);
);


// dimmer

gDimmer;


DimmerTime#
(
	(pMod == 0)?
	(
		gDimmer = 1;
	)
	:
	(
		gDimmer = cDim / 255;
	);
);


// strobe

kStrobeMin = 0.3;		// [Hz] (?)
kStrobeMax = 10;		// [Hz] (?)
kStrobeDur = 1 / 20;	// [s] (?)

gShutter;
gStrobe[0];


StrobeTime#
(
	(pMod == 0)?
	(
		gShutter = 1;
	)
	:
	(
		(cStb < 11)?	// no strobe(?)
		(
			gShutter = 1;
		)
		:
		(
			ss = ParamSqr(kStrobeMin, kStrobeMax, 11, 255, cStb);
			StrobeProgress(gStrobe, $0 * ss, kStrobeDur * ss);
			gShutter = gStrobe.ef;
		);
	);
);


// program
kFuncSpdMin = 0.1;	// (?)
kFuncSpdMax = 1;	// (?)

gFuncPh;

FuncTime#
(
	(pMod == 1)?
	(
		fs = ParamSqr(kFuncSpdMin, kFuncSpdMax, 0, 255, cPgs);
		gFuncPh  = Cycle(gFuncPh + $0 * fs);

		(cPrg < 51)?	// none
		(
		)
		:(cPrg < 101)?	// jump
		(	// (simple hue)
			h = floor(gFuncPh * 6) / 6;
			gColor = RGBfromHSV(h, 1, 1);
		)
		:(cPrg < 151)?	// gradient
		(	// (simple hue)
			gColor = RGBfromHSV(gFuncPh, 1, 1);
		)
		:(cPrg < 201)?	// clock(?)
		(	// (simple hue)
			gColor = RGBfromHSV(gFuncPh, 1, 1);
		)
		:	// sound
		(
			gColor = Vec(1, 1, 1, 1, 1, 1);
		);
	);
);


// protocol methods

UPDATE#
(
	ColorTime($0);
	DimmerTime($0);
	StrobeTime($0);
	FuncTime($0);

	PRM?
	(
		// shape
		hw = kWid * 0.5;
		SHAPE = Box(-hw, hw, -hw, hw, kZBack, kZFront);
			
		cMod = pMod;
		CTLS = 1;

		// setup light
		l = LIGHT[0];
		l.pos[2] = kZFront;
		l.dia = kDia;
		l.spdh = kSpread;
		l.spdv = kSpread;
		l.cnt = kCnt;
		LIGHT[0] = l;
	);

//	(CTL | PRM)?
	(
		c = RGBfromRGBWAU(gColor, kWhite, kAmber, kUV);
		c = VecScale(c, kSource * gDimmer * gShutter);

		// setup light
		l = LIGHT[0];
		l.color = c;
		LIGHT[0] = l;
	);

	PRM = CTL = 0;
);

";


chmap:
"cR cG cB cW cA cU",
"cDim cStb cPrg cPgs cR cG cB cW cA cU";


ctlprop:
{
	ctls:
	{
		id:cPrg;
		name:Program;
	},
	{
		id:cPgs;
		name:Speed;
	};
};


prm:
{
	controls:
	{
		type:selector;
		id:pMod;
		name:Mode;
		ini:0;
		items:
		{
			text:6ch;
			value:0;
		},
		{
			text:10ch;
			value:1;
		};
	};
};

};
